package br.com.esporte.view.site.grupo.comunidade.chamada;

import java.util.ArrayList;
import java.util.List;

import org.apache.wicket.markup.html.link.Link;

import br.com.esporte.business.impl.converter.DateConverter;
import br.com.esporte.exception.ViewException;
import br.com.esporte.model.DiaPraticadoGrupo;
import br.com.esporte.model.Grupo;
import br.com.esporte.model.PresencaDiaPraticado;
import br.com.esporte.persistence.filter.FiltroDiaPraticadoGrupo;
import br.com.esporte.persistence.filter.FiltroPresencaDiaPraticado;
import br.com.esporte.view.infra.generic.Pagina;
import br.com.esporte.view.infra.generic.PaginaAlterarEntidadeComponent;
import br.com.esporte.view.site.component.listaChamada.ListChamadaComponent;
import br.com.esporte.view.site.component.menu.menuTopo.MenuTopo;
import br.com.esporte.view.site.component.menu.menuTopo.MenuTopoComponente;
import br.com.esporte.view.site.component.paginacao.PaginacaoComponent;
import br.com.esporte.view.site.grupo.comunidade.PaginaComunidade;
import br.com.esporte.view.site.grupo.comunidade.diaPraticado.PaginaListarDiaPraticado;

/**
 * 
 * @author Milton Domingues
 *
 */
public class PaginaListarChamadas extends PaginaComunidade implements PaginaAlterarEntidadeComponent<PresencaDiaPraticado> {

	private static final String LIST_CHAMADA_ID = "listaChamada";
	private static final String LIST_CHAMADA_DATA = "listDataChadamas";
	private static final String LIST_MENUS_TOPO_ID = "menuTopo";

	private DiaPraticadoGrupo diaPraticadoGrupo;

	public PaginaListarChamadas(DiaPraticadoGrupo diaPraticadoGrupo, Grupo grupo) {
		setDiaPraticadoGrupo(diaPraticadoGrupo);
		setGrupo(grupo);
		montarPagina();
	}
	public PaginaListarChamadas(Grupo grupo) {
		super(grupo);
	}

	@Override
	public void alterar(PresencaDiaPraticado entidade) {
		getFachada().alterar(entidade, getUsuarioLogado());
	}

	private void carregarDiaPraticado(Grupo grupo){
		if(getDiaPraticadoGrupo() == null){
			diaPraticadoGrupo = getFachada().consultarProximaDiaPraticadoGrupo(grupo);
		}
	}

	@Override
	public void carregarView() {
		super.carregarView();
		carregarDiaPraticado(getGrupo());
	}

	private ListChamadaComponent criarContainerListChamada(DiaPraticadoGrupo diaPraticado){
		ListChamadaComponent chamadaComponent = new ListChamadaComponent(LIST_CHAMADA_ID, diaPraticado, getChamada(diaPraticado), getUsuarioLogado(), this);
		return chamadaComponent;
	}

	private PaginacaoComponent<DiaPraticadoGrupo> criarContainerListChamadaData(Grupo grupo, DiaPraticadoGrupo diaPraticadoGrupo){
		PaginacaoComponent<DiaPraticadoGrupo> list = new PaginacaoComponent<DiaPraticadoGrupo>(LIST_CHAMADA_DATA, getDiaPraticadoGrupo(grupo, diaPraticadoGrupo)) {

			private static final long serialVersionUID = -2464012439185986816L;

			@Override
			public void acaoPagina(DiaPraticadoGrupo entidade) {
				setResponsePage(new PaginaListarChamadas(entidade, getGrupo()));
			}

			@Override
			public String getLabelPage(DiaPraticadoGrupo entidade) {
				return DateConverter.converterDataHoraToString(entidade.getDataHoraInicio());
			}
		};
		return list;
	}

	private MenuTopoComponente criarMenuTopo(){
		return new MenuTopoComponente(LIST_MENUS_TOPO_ID, getMenusTopo(), getGrupo().getTipo());
	}

	private List<PresencaDiaPraticado> getChamada(DiaPraticadoGrupo diaPraticadoGrupo){
		List<PresencaDiaPraticado> list = new ArrayList<PresencaDiaPraticado>();
		if(diaPraticadoGrupo != null){
			FiltroPresencaDiaPraticado filtro = new FiltroPresencaDiaPraticado();
			filtro.addEquals(FiltroPresencaDiaPraticado.DIA_PRATICADO, diaPraticadoGrupo);
			list.addAll(getFachada().consultar(filtro));
		}
		return list;
	}

	public DiaPraticadoGrupo getDiaPraticadoGrupo() {
		return diaPraticadoGrupo;
	}

	private List<DiaPraticadoGrupo> getDiaPraticadoGrupo(Grupo grupo, DiaPraticadoGrupo diaPraticadoGrupo){
		FiltroDiaPraticadoGrupo filtro = new FiltroDiaPraticadoGrupo();
		filtro.addEquals(FiltroDiaPraticadoGrupo.GRUPO, grupo);
		List<DiaPraticadoGrupo> list = getFachada().consultar(filtro);
		list.remove(diaPraticadoGrupo);
		return list;
	}

	private List<MenuTopo> getMenusTopo(){
		List<MenuTopo> list = new ArrayList<MenuTopo>();

		Link<Pagina> event1 = new Link<Pagina>(MenuTopoComponente.LINK_MENU_ID) {

			private static final long serialVersionUID = 6408049973489553594L;

			@Override
			public void onClick() {
				try{
					setResponsePage(new PaginaListarDiaPraticado(getGrupo(), getDiaPraticadoGrupo()));
				}catch (ViewException e) {
					redirectViewException(e);
				}
			}
		};
		list.add(new MenuTopo(event1, "Listar Dia Praticado"));

		return list;
	}

	@Override
	public String getTipoEsporte() {
		return getGrupo().getTipo().getCodigo();
	}

	@Override
	public void montarPagina() {
		super.montarPagina();
		addContainer(criarMenuTopo());
		addContainer(criarContainerListChamada(getDiaPraticadoGrupo()));
		addContainer(criarContainerListChamadaData(getGrupo(), getDiaPraticadoGrupo()));
	}

	public void setDiaPraticadoGrupo(DiaPraticadoGrupo diaPraticadoGrupo) {
		this.diaPraticadoGrupo = diaPraticadoGrupo;
	}

	@Override
	public void validarView() {
		super.validarView();
		if(getDiaPraticadoGrupo() == null){
			throw new ViewException("Nenhuma chamada registrada!");
		}
	}

	@Override
	public boolean viewPublica() {
		return true;
	}

}
